package com.hy.proxy.core.util;

import com.google.gson.reflect.TypeToken;
import com.hy.proxy.common.CipherUtils;
import com.hy.proxy.common.JsonUtils;
import com.hy.proxy.core.entity.*;
import lombok.extern.slf4j.Slf4j;

import java.util.List;

/**
 * @Author: hy
 * @Date: Created in 2019/10/1/23:16
 * @Description: 关于代理链接各种解析、写出方式的工具类
 * @Version: 1.0
 */
@Slf4j
public class ProxyUtils {

    /**
     * Base64加密整个Proxy列表的链接
     *
     * @param proxyList
     * @return
     */
    public static <T extends Proxy> String encoderProxyList(List<T> proxyList) {

        StringBuffer sb = new StringBuffer();

        for (T t : proxyList) {
            sb.append(getProxyLink(t)).append("\n");
        }

        return CipherUtils.BASE64.encoder(sb.toString());
    }

    /**
     * 解密Proxy链接并生成对象
     *
     * @param base64 Proxy链接
     * @return
     */
    public static Proxy decoderProxyLink(String base64) {

        String json = "";
        String base64Str = "";
        TypeToken typeToken;

        if (base64.contains("ssr://")) {
            base64Str = base64.substring("ssr://".length());
            typeToken = new TypeToken<SSR>() {
            };
        } else if (base64.contains("vmess://")) {
            base64Str = base64.substring("vmess://".length());
            typeToken = new TypeToken<V2ray>() {
            };
        } else {
            typeToken = new TypeToken<SS>() {
            };
            base64Str = base64.substring("ss://".length());
        }

        json = CipherUtils.BASE64.decoder(base64Str);
        return JsonUtils.getGson().fromJson(json, typeToken.getType());
    }

    /**
     * 将Proxy列表转换为Json
     *
     * @param proxy
     * @return
     */
    public static <T extends Proxy> String toJsonByProxyList(List<T> proxy) {
        return JsonUtils.getGson().toJson(proxy);
    }

    /**
     * 将Json转换为Proxy列表
     * @param type
     * @param json
     * @return
     */
    public static List<Proxy> toProxyListByJson(Proxy.ProxyType type, String json) {

        List<Proxy> proxyList = null;

        if (type == Proxy.ProxyType.SSR) {
            proxyList = JsonUtils.getGson().fromJson(json, new TypeToken<List<SSR>>() {
            }.getType());
        } else if (type == Proxy.ProxyType.V2RAY) {

            proxyList = JsonUtils.getGson().fromJson(json, new TypeToken<List<V2ray>>() {
            }.getType());
        } else if (type == Proxy.ProxyType.SS) {
            proxyList = JsonUtils.getGson().fromJson(json, new TypeToken<List<SS>>() {
            }.getType());
        }

        return proxyList;
    }

    /**
     * 获取一个Proxy对象的链接
     *
     * @param proxy
     * @return
     */
    public static <T extends Proxy> String getProxyLink(T proxy) {

        if (proxy instanceof SSR) {
            return ((SSR) proxy).getSsrLink();
        } else if (proxy instanceof V2ray) {
            return ((V2ray) proxy).getUrl();
        } else if (proxy instanceof SS) {
            return ((SS) proxy).getSsLink();
        }

        return null;
    }
}
